{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Learning logistic regression for classification of Iris dataset\n",
    "\n",
    "We exercised a linear regression for diabetes dataset. In this exercise, we will do a classification task, classifying three different types of irises. Description about the dataset is on https://en.wikipedia.org/wiki/Iris_flower_data_set and http://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html.\n",
    "\n",
    "Let's import necessary libraries at first, and look the dataset.\n",
    "The example code about this exercise is introduced on http://scikit-learn.org/stable/auto_examples/linear_model/plot_iris_logistic.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import linear_model, datasets\n",
    "\n",
    "iris = datasets.load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'DESCR': 'Iris Plants Database\\n====================\\n\\nNotes\\n-----\\nData Set Characteristics:\\n    :Number of Instances: 150 (50 in each of three classes)\\n    :Number of Attributes: 4 numeric, predictive attributes and the class\\n    :Attribute Information:\\n        - sepal length in cm\\n        - sepal width in cm\\n        - petal length in cm\\n        - petal width in cm\\n        - class:\\n                - Iris-Setosa\\n                - Iris-Versicolour\\n                - Iris-Virginica\\n    :Summary Statistics:\\n\\n    ============== ==== ==== ======= ===== ====================\\n                    Min  Max   Mean    SD   Class Correlation\\n    ============== ==== ==== ======= ===== ====================\\n    sepal length:   4.3  7.9   5.84   0.83    0.7826\\n    sepal width:    2.0  4.4   3.05   0.43   -0.4194\\n    petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)\\n    petal width:    0.1  2.5   1.20  0.76     0.9565  (high!)\\n    ============== ==== ==== ======= ===== ====================\\n\\n    :Missing Attribute Values: None\\n    :Class Distribution: 33.3% for each of 3 classes.\\n    :Creator: R.A. Fisher\\n    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\\n    :Date: July, 1988\\n\\nThis is a copy of UCI ML iris datasets.\\nhttp://archive.ics.uci.edu/ml/datasets/Iris\\n\\nThe famous Iris database, first used by Sir R.A Fisher\\n\\nThis is perhaps the best known database to be found in the\\npattern recognition literature.  Fisher\\'s paper is a classic in the field and\\nis referenced frequently to this day.  (See Duda & Hart, for example.)  The\\ndata set contains 3 classes of 50 instances each, where each class refers to a\\ntype of iris plant.  One class is linearly separable from the other 2; the\\nlatter are NOT linearly separable from each other.\\n\\nReferences\\n----------\\n   - Fisher,R.A. \"The use of multiple measurements in taxonomic problems\"\\n     Annual Eugenics, 7, Part II, 179-188 (1936); also in \"Contributions to\\n     Mathematical Statistics\" (John Wiley, NY, 1950).\\n   - Duda,R.O., & Hart,P.E. (1973) Pattern Classification and Scene Analysis.\\n     (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.\\n   - Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New System\\n     Structure and Classification Rule for Recognition in Partially Exposed\\n     Environments\".  IEEE Transactions on Pattern Analysis and Machine\\n     Intelligence, Vol. PAMI-2, No. 1, 67-71.\\n   - Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\".  IEEE Transactions\\n     on Information Theory, May 1972, 431-433.\\n   - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al\"s AUTOCLASS II\\n     conceptual clustering system finds 3 classes in the data.\\n   - Many, many more ...\\n',\n",
       " 'data': array([[ 5.1,  3.5,  1.4,  0.2],\n",
       "        [ 4.9,  3. ,  1.4,  0.2],\n",
       "        [ 4.7,  3.2,  1.3,  0.2],\n",
       "        [ 4.6,  3.1,  1.5,  0.2],\n",
       "        [ 5. ,  3.6,  1.4,  0.2],\n",
       "        [ 5.4,  3.9,  1.7,  0.4],\n",
       "        [ 4.6,  3.4,  1.4,  0.3],\n",
       "        [ 5. ,  3.4,  1.5,  0.2],\n",
       "        [ 4.4,  2.9,  1.4,  0.2],\n",
       "        [ 4.9,  3.1,  1.5,  0.1],\n",
       "        [ 5.4,  3.7,  1.5,  0.2],\n",
       "        [ 4.8,  3.4,  1.6,  0.2],\n",
       "        [ 4.8,  3. ,  1.4,  0.1],\n",
       "        [ 4.3,  3. ,  1.1,  0.1],\n",
       "        [ 5.8,  4. ,  1.2,  0.2],\n",
       "        [ 5.7,  4.4,  1.5,  0.4],\n",
       "        [ 5.4,  3.9,  1.3,  0.4],\n",
       "        [ 5.1,  3.5,  1.4,  0.3],\n",
       "        [ 5.7,  3.8,  1.7,  0.3],\n",
       "        [ 5.1,  3.8,  1.5,  0.3],\n",
       "        [ 5.4,  3.4,  1.7,  0.2],\n",
       "        [ 5.1,  3.7,  1.5,  0.4],\n",
       "        [ 4.6,  3.6,  1. ,  0.2],\n",
       "        [ 5.1,  3.3,  1.7,  0.5],\n",
       "        [ 4.8,  3.4,  1.9,  0.2],\n",
       "        [ 5. ,  3. ,  1.6,  0.2],\n",
       "        [ 5. ,  3.4,  1.6,  0.4],\n",
       "        [ 5.2,  3.5,  1.5,  0.2],\n",
       "        [ 5.2,  3.4,  1.4,  0.2],\n",
       "        [ 4.7,  3.2,  1.6,  0.2],\n",
       "        [ 4.8,  3.1,  1.6,  0.2],\n",
       "        [ 5.4,  3.4,  1.5,  0.4],\n",
       "        [ 5.2,  4.1,  1.5,  0.1],\n",
       "        [ 5.5,  4.2,  1.4,  0.2],\n",
       "        [ 4.9,  3.1,  1.5,  0.1],\n",
       "        [ 5. ,  3.2,  1.2,  0.2],\n",
       "        [ 5.5,  3.5,  1.3,  0.2],\n",
       "        [ 4.9,  3.1,  1.5,  0.1],\n",
       "        [ 4.4,  3. ,  1.3,  0.2],\n",
       "        [ 5.1,  3.4,  1.5,  0.2],\n",
       "        [ 5. ,  3.5,  1.3,  0.3],\n",
       "        [ 4.5,  2.3,  1.3,  0.3],\n",
       "        [ 4.4,  3.2,  1.3,  0.2],\n",
       "        [ 5. ,  3.5,  1.6,  0.6],\n",
       "        [ 5.1,  3.8,  1.9,  0.4],\n",
       "        [ 4.8,  3. ,  1.4,  0.3],\n",
       "        [ 5.1,  3.8,  1.6,  0.2],\n",
       "        [ 4.6,  3.2,  1.4,  0.2],\n",
       "        [ 5.3,  3.7,  1.5,  0.2],\n",
       "        [ 5. ,  3.3,  1.4,  0.2],\n",
       "        [ 7. ,  3.2,  4.7,  1.4],\n",
       "        [ 6.4,  3.2,  4.5,  1.5],\n",
       "        [ 6.9,  3.1,  4.9,  1.5],\n",
       "        [ 5.5,  2.3,  4. ,  1.3],\n",
       "        [ 6.5,  2.8,  4.6,  1.5],\n",
       "        [ 5.7,  2.8,  4.5,  1.3],\n",
       "        [ 6.3,  3.3,  4.7,  1.6],\n",
       "        [ 4.9,  2.4,  3.3,  1. ],\n",
       "        [ 6.6,  2.9,  4.6,  1.3],\n",
       "        [ 5.2,  2.7,  3.9,  1.4],\n",
       "        [ 5. ,  2. ,  3.5,  1. ],\n",
       "        [ 5.9,  3. ,  4.2,  1.5],\n",
       "        [ 6. ,  2.2,  4. ,  1. ],\n",
       "        [ 6.1,  2.9,  4.7,  1.4],\n",
       "        [ 5.6,  2.9,  3.6,  1.3],\n",
       "        [ 6.7,  3.1,  4.4,  1.4],\n",
       "        [ 5.6,  3. ,  4.5,  1.5],\n",
       "        [ 5.8,  2.7,  4.1,  1. ],\n",
       "        [ 6.2,  2.2,  4.5,  1.5],\n",
       "        [ 5.6,  2.5,  3.9,  1.1],\n",
       "        [ 5.9,  3.2,  4.8,  1.8],\n",
       "        [ 6.1,  2.8,  4. ,  1.3],\n",
       "        [ 6.3,  2.5,  4.9,  1.5],\n",
       "        [ 6.1,  2.8,  4.7,  1.2],\n",
       "        [ 6.4,  2.9,  4.3,  1.3],\n",
       "        [ 6.6,  3. ,  4.4,  1.4],\n",
       "        [ 6.8,  2.8,  4.8,  1.4],\n",
       "        [ 6.7,  3. ,  5. ,  1.7],\n",
       "        [ 6. ,  2.9,  4.5,  1.5],\n",
       "        [ 5.7,  2.6,  3.5,  1. ],\n",
       "        [ 5.5,  2.4,  3.8,  1.1],\n",
       "        [ 5.5,  2.4,  3.7,  1. ],\n",
       "        [ 5.8,  2.7,  3.9,  1.2],\n",
       "        [ 6. ,  2.7,  5.1,  1.6],\n",
       "        [ 5.4,  3. ,  4.5,  1.5],\n",
       "        [ 6. ,  3.4,  4.5,  1.6],\n",
       "        [ 6.7,  3.1,  4.7,  1.5],\n",
       "        [ 6.3,  2.3,  4.4,  1.3],\n",
       "        [ 5.6,  3. ,  4.1,  1.3],\n",
       "        [ 5.5,  2.5,  4. ,  1.3],\n",
       "        [ 5.5,  2.6,  4.4,  1.2],\n",
       "        [ 6.1,  3. ,  4.6,  1.4],\n",
       "        [ 5.8,  2.6,  4. ,  1.2],\n",
       "        [ 5. ,  2.3,  3.3,  1. ],\n",
       "        [ 5.6,  2.7,  4.2,  1.3],\n",
       "        [ 5.7,  3. ,  4.2,  1.2],\n",
       "        [ 5.7,  2.9,  4.2,  1.3],\n",
       "        [ 6.2,  2.9,  4.3,  1.3],\n",
       "        [ 5.1,  2.5,  3. ,  1.1],\n",
       "        [ 5.7,  2.8,  4.1,  1.3],\n",
       "        [ 6.3,  3.3,  6. ,  2.5],\n",
       "        [ 5.8,  2.7,  5.1,  1.9],\n",
       "        [ 7.1,  3. ,  5.9,  2.1],\n",
       "        [ 6.3,  2.9,  5.6,  1.8],\n",
       "        [ 6.5,  3. ,  5.8,  2.2],\n",
       "        [ 7.6,  3. ,  6.6,  2.1],\n",
       "        [ 4.9,  2.5,  4.5,  1.7],\n",
       "        [ 7.3,  2.9,  6.3,  1.8],\n",
       "        [ 6.7,  2.5,  5.8,  1.8],\n",
       "        [ 7.2,  3.6,  6.1,  2.5],\n",
       "        [ 6.5,  3.2,  5.1,  2. ],\n",
       "        [ 6.4,  2.7,  5.3,  1.9],\n",
       "        [ 6.8,  3. ,  5.5,  2.1],\n",
       "        [ 5.7,  2.5,  5. ,  2. ],\n",
       "        [ 5.8,  2.8,  5.1,  2.4],\n",
       "        [ 6.4,  3.2,  5.3,  2.3],\n",
       "        [ 6.5,  3. ,  5.5,  1.8],\n",
       "        [ 7.7,  3.8,  6.7,  2.2],\n",
       "        [ 7.7,  2.6,  6.9,  2.3],\n",
       "        [ 6. ,  2.2,  5. ,  1.5],\n",
       "        [ 6.9,  3.2,  5.7,  2.3],\n",
       "        [ 5.6,  2.8,  4.9,  2. ],\n",
       "        [ 7.7,  2.8,  6.7,  2. ],\n",
       "        [ 6.3,  2.7,  4.9,  1.8],\n",
       "        [ 6.7,  3.3,  5.7,  2.1],\n",
       "        [ 7.2,  3.2,  6. ,  1.8],\n",
       "        [ 6.2,  2.8,  4.8,  1.8],\n",
       "        [ 6.1,  3. ,  4.9,  1.8],\n",
       "        [ 6.4,  2.8,  5.6,  2.1],\n",
       "        [ 7.2,  3. ,  5.8,  1.6],\n",
       "        [ 7.4,  2.8,  6.1,  1.9],\n",
       "        [ 7.9,  3.8,  6.4,  2. ],\n",
       "        [ 6.4,  2.8,  5.6,  2.2],\n",
       "        [ 6.3,  2.8,  5.1,  1.5],\n",
       "        [ 6.1,  2.6,  5.6,  1.4],\n",
       "        [ 7.7,  3. ,  6.1,  2.3],\n",
       "        [ 6.3,  3.4,  5.6,  2.4],\n",
       "        [ 6.4,  3.1,  5.5,  1.8],\n",
       "        [ 6. ,  3. ,  4.8,  1.8],\n",
       "        [ 6.9,  3.1,  5.4,  2.1],\n",
       "        [ 6.7,  3.1,  5.6,  2.4],\n",
       "        [ 6.9,  3.1,  5.1,  2.3],\n",
       "        [ 5.8,  2.7,  5.1,  1.9],\n",
       "        [ 6.8,  3.2,  5.9,  2.3],\n",
       "        [ 6.7,  3.3,  5.7,  2.5],\n",
       "        [ 6.7,  3. ,  5.2,  2.3],\n",
       "        [ 6.3,  2.5,  5. ,  1.9],\n",
       "        [ 6.5,  3. ,  5.2,  2. ],\n",
       "        [ 6.2,  3.4,  5.4,  2.3],\n",
       "        [ 5.9,  3. ,  5.1,  1.8]]),\n",
       " 'feature_names': ['sepal length (cm)',\n",
       "  'sepal width (cm)',\n",
       "  'petal length (cm)',\n",
       "  'petal width (cm)'],\n",
       " 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "        1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]),\n",
       " 'target_names': array(['setosa', 'versicolor', 'virginica'],\n",
       "       dtype='<U10')}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150, 4)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150,)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.target.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As shown above, total number of samples is 150. A feature set of the dataset is composed of ['sepal length(cm)', 'sepal width(cm)', 'petal length(cm)', 'petal width(cm)'], and classes of the samples are ['setosa', 'versicolor', 'virginica'].\n",
    "\n",
    "In the tutorial, it only use the first two features, i.e. 'sepal length(cm)' and 'sepal width(cm)'."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150, 2)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = iris.data[:, :2]\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150,)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y = iris.target\n",
    "Y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We should classify the samples with respect to the first two features.\n",
    "For classification, we will use a logistic regression model which is already implemented in the scikit-learn library(http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html).\n",
    "\n",
    "The parameter 'C' at below means 'inverse of regularization strength'. We will learn further about the regularization later."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=100000.0, class_weight=None, dual=False,\n",
       "          fit_intercept=True, intercept_scaling=1, max_iter=100,\n",
       "          multi_class='ovr', n_jobs=1, penalty='l2', random_state=None,\n",
       "          solver='liblinear', tol=0.0001, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "logreg = linear_model.LogisticRegression(C=1e5)\n",
    "logreg.fit(X,Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We complete to get a model which classifies the samples by the logistic regression.\n",
    "To visualize our model, we have to get grid mesh points that range from minimum to maximum values of each feature."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.7999999999999998, 8.4000000000000004)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_min, x_max = X[:,0].min() - 0.5, X[:,0].max() + 0.5\n",
    "y_min, y_max = X[:,1].min() - 0.5, X[:,1].max() + 0.5\n",
    "x_min, x_max"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.5, 4.9000000000000004)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_min, y_max"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can check thaat min and max values of each feature are (3.8, 8.4) and (1.5, 4.9).\n",
    "We will generate the two-dimensional mesh space with a grid spacing, h=0.02."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[ 3.8 ,  3.82,  3.84, ...,  8.36,  8.38,  8.4 ],\n",
       "        [ 3.8 ,  3.82,  3.84, ...,  8.36,  8.38,  8.4 ],\n",
       "        [ 3.8 ,  3.82,  3.84, ...,  8.36,  8.38,  8.4 ],\n",
       "        ..., \n",
       "        [ 3.8 ,  3.82,  3.84, ...,  8.36,  8.38,  8.4 ],\n",
       "        [ 3.8 ,  3.82,  3.84, ...,  8.36,  8.38,  8.4 ],\n",
       "        [ 3.8 ,  3.82,  3.84, ...,  8.36,  8.38,  8.4 ]]),\n",
       " array([[ 1.5 ,  1.5 ,  1.5 , ...,  1.5 ,  1.5 ,  1.5 ],\n",
       "        [ 1.52,  1.52,  1.52, ...,  1.52,  1.52,  1.52],\n",
       "        [ 1.54,  1.54,  1.54, ...,  1.54,  1.54,  1.54],\n",
       "        ..., \n",
       "        [ 4.86,  4.86,  4.86, ...,  4.86,  4.86,  4.86],\n",
       "        [ 4.88,  4.88,  4.88, ...,  4.88,  4.88,  4.88],\n",
       "        [ 4.9 ,  4.9 ,  4.9 , ...,  4.9 ,  4.9 ,  4.9 ]]))"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h = 0.02\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
    "xx, yy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reshape the numpy arrays with keyword ravel(), https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 3.8 ,  3.82,  3.84, ...,  8.36,  8.38,  8.4 ]),\n",
       " array([ 1.5,  1.5,  1.5, ...,  4.9,  4.9,  4.9]))"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xx.ravel(), yy.ravel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 3.8 ,  1.5 ],\n",
       "       [ 3.82,  1.5 ],\n",
       "       [ 3.84,  1.5 ],\n",
       "       ..., \n",
       "       [ 8.36,  4.9 ],\n",
       "       [ 8.38,  4.9 ],\n",
       "       [ 8.4 ,  4.9 ]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.c_[xx.ravel(), yy.ravel()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we can get the class for each grid point by prediction from the trained logistic model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, ..., 2, 2, 2])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "Z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(39501,)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Z.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(171, 231)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Z = Z.reshape(xx.shape)\n",
    "Z.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot both the used data samples as point, which corresponds to the plt.scatter() as below, and colormesh, plt.pcolormesh(~~~)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAARYAAADTCAYAAABEHzz8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsnXd4VMX3h9/Z3WQ3vSeEhIQEEnrv\nCKL0JkUUFAQR/SkKlq8dG4oi2AXsvSGCKCC9SVN6byGUQHrvZZNt8/tjwyZLICSYEMp9nycP7GTu\n3HOT7Gdnzpw5R0gpUVBQUKhJVHVtgIKCwo2HIiwKCgo1jiIsCgoKNY4iLAoKCjWOIiwKCgo1jiIs\nCgoKNY4iLAoKCjWOIiwKCgo1jiIsCgoKNY6mrg2oLm6e3tKvfnBdm6Fwg6JKPVXXJlyznMkqzpBS\n+lWl73UnLH71g5k5f1Vdm6FwA+LyXj+gYV2bcc0yfMGJ2Kr2VZZCCgqcFxWFmkIRFoWbHkVUah5F\nWBRuahRRqR0UYVG4aVFEpfZQhEVBQaHGUYRF4aZEma3ULoqwKNx0KKJS+yjConBToYjK1UERFoWb\nBkVUrh6KsCjcFCiicnVRhEXhhkcRlauPIiwKCgo1jiIsCjc0ymylblCEReGGRRGVuqPWhUUIoRZC\nHBBCrLjI9yYKIdKFEAdLvx6qbXsUbg4UUalbrkY+lieBKMD9Et9fKKWcehXsULhJUESl7qnVGYsQ\nIhgYAnxTm/dRUDiPIirXBrW9FPoYeB6wVNJnlBDisBBisRCiwcU6CCEeFkLsFULszc/OqhVDFRQU\nao5aExYhxFAgTUq5r5Juy4GGUsrWwAbgx4t1klJ+JaXsKKXs6OblXQvWKlxI9ME9zH3hUV6dcAff\nzXqJ1PhzdW3SZVFmK9cOtTljuQUYJoQ4B/wG9BZC/FK+g5QyU0pZUvrya6BDLdqjUEX2/L2aOc9P\nplnHbox/Zjpunt5Mf2AkiWdP17Vpl0QRlWuLWnPeSimnAdMAhBC3Ac9KKe8r30cIESilTC59OQyr\nk1ehDrFYLPw6520en/UJzTp0AyCyTUe0Ts4s/WYuU2bOrWMLK6KIyrXHVY9jEULMEEIMK335hBDi\nmBDiEPAEMPFq26NgT15WBoX5uTRt39WuvXPvQUQf3FNHVl0aRVSuTa5K+Q8p5WZgc+n/XyvXbpvV\nKFwbOLm4YTaZyMvOxMPb19aeGn8OT1//OrSsIoqoXLsokbcKdmidnOgxaCTfz3qZooJ8ANKTEvh1\nzkz63j2+jq1TuF647gqWKdQ+4/73Ct/PfoUnhnTDJyCQrLRkhk6YTM8ho+raNBvKbOXaRhEWhQo4\n6px45PUPuPfJl8hKS6Feg4bonF3q2iwbiqhc+yjConBJ3L18cPfyqWsz7FBE5fpA8bHchBiK9ZyL\nPkZ2ekpdm1ItFFG5flBmLDcZ6xf9yO9ffICXrz/Z6ak079idh197D2e3S50RvTZQROX6Qpmx3EQc\n2LaRlb98xevfLeGdRRuYt2o3Lu4efPPWC3VtWqUoonL9oQjLTcSG33/mrsnPUr9hI8C6tTz+2dc5\nvHMbuZnpdWydwo2EIiw3ETmZaQQEh9q16Zyc8fDxJS87s46sqhxltnJ9ogjLdUpxUSE71v7F5mUL\nyUxNvvwFQJO2ndm9cZVdW9ypKIry86gXElYbZv4nFFG5flGct9chx/fuYM7zkwlv0QYXN3fmf/Qm\nwx6Yyh33T670uiHjH2b6xOFYLGY69R5EcmwMS776mDFTnsfBUXuVrK8aiqhc3yjCcp1hKNYz98XH\neGL2Z7TofAsA2ekpvDphGM3ad6Fxq3aXvNanXn1m/PQXq375ml8/nomXrz8PT3+fll16XC3zq4Qi\nKtc/irBcZxzeuZUGjZrYRAXAy68efUfdx79rllYqLADe/oHc9/RrlfapSxRRuTFQfCzXGSaDAa2T\nU4V2rbMLxpKSi1xx/aCIyo2DIizXGS279ODEgT2kxJ21tRmK9Wxe+hvtb+1bq/dOjjvLok/f5du3\np7Fj7V+YjMZavZ/C9Utd1xXSCiEWCiFOCyF2CSEa1rY91zuuHl6Me+plXp90J7/Nm81fP3zGy/cN\nJTSyOW179K61++7ZtIbXJ47AaDAQHB7J2oU/MHvKOAwlxTUyvjJbubGo67pCDwLZUsrGQoh7gHeA\nMVfBpuua20feS0Tr9vy7eik56WmMf+Y1WnW9FSFErdzPZDTw3dsv8dycH2w+nH6j7+fdxyewZdlC\n+o2+/4rHVgTlxqSu6woNpywz/2Kgj6itd8cNRnCjJoyZ+gITnnud1t161ZqoAMQcP4yXX4CdY1il\nUtFn1Dj2b9t4xeMqonLjUtd1hYKAeAAppQnIBSqc01fqCtUtjlod+sICpJR27frCAhy1uisaUxGV\nG5u6rit0sY9ZWaFBqSt0RaTGn2PGQ3cxuW87pg7sxDdvvYjFUlntuIsT2qQFDo6ObPlrka2tIC+H\nFT99QY/BI6s9niIqNz616WM5X1doMKAD3IUQv1xQAiQBaAAkCCE0gAegTElqgKz0VF6+bwjte/Zl\n9JTnyc/JYuG8d3j9gZHM+HFZtcYSQvDE7M9494mJbF76G76BQRzeuZXbho2h4+0Da+kJFK5n6rSu\nEPAXcD+wA7gL+FteON9WuCJ+em86ka078Nhbc2xtzTp0ZerAzpw+epDGLdtWa7zgRk34cOlWjuzc\nSn5uNqOnPI9/UEi17VJmKzcHVz3yVggxA9grpfwL+Bb4WQhxGutM5Z6rbc+NSvypKEY8+IRdm6u7\nJxGt27Nn46pqCwuAxsGBdj37XLFNiqjcPNR1XaFi4O6rYcP1jtlsxmw24+joWKX+zq5uJJ49Zdcm\npSQ59izd+g+v8n0tFgsq1X93xSmicuVYpER1mV0/KSUSLtvvaqGcFbrGKcjP5dVxQ8hKT8FoMODi\n5s6td9zN+GemV3rdnQ8/zdwXH6V1t14079gNk9HAkq/nYijWc9uIykOFpJSs+fVbVs3/mqzUZEIi\nm3PX5Gfo0OvKxEERleojpWTN6RyWRGWRWmgk1EPLPa186N7APhysyGjm50PpbDqbh8FsoV2gCxPb\n+tPAo25PqyvCco3zwl19CQgO5fl5P+FXvwG7N67kqxnP4xNQn8H3/d8lr2vXszdDxj/M+09NQqvT\nUawvwtnVjRc//fmyM5DlP3zGrg0reeaj7whp3JRDO7bw9Yzn0Oqcqn0SWhGVK2PlqWzWnc7luVvq\n08hbx+HUIubuSkajEnQOcrP1e+efJLx0aj4dEoaro5p1Z3J49e84Ph4Uhqeu7t7eirBcw5w6vI+C\nvBze+Wg9ru6eAHQfOIK0xHiW//h5pcICcNfkZxgx6XEO79yKu7dvlfwqJqORVb98zevfL7Elf2rX\nozdjn3qF5T9+fs2lWLgRsUjJn8ezeK1XMA29rHFCbeu58HCHAP48nmUTljNZxSTlG3itVzhqlXUJ\ndEcTb2JzS9hwJpe7WtRd6RblEOI1zMHtm/AJCLSJynmatO2E2WSq0hgaR0fa39q3ys7a/JwsEKJC\nRrnINh1IPnemaoaXosxWroxik4UCg9kmKudp6utEQp7B9joxz0CEj84mKrZ+Pk4k5tftSXdFWK5h\n2t3Sl8zUJPJzsu3aj+/bgUbjUKG/xWIh7mQUcaeibFGyJqORmOOHSS53Groy3Dy9EUKQePa0XfuJ\n/bsIahRZZdsVUblydBoVblo1Z7LsD3geSysixKPMed/Aw5ETGXpMFvsIjWPpRde+j0UIoQVGAQ3L\n95dSzqg9sxQAGrdqi5uHF+8+PoEHX5lNQHAoO9evYPkPnzHuqVft+p48tI8vpv/PujsgLTg4aLl1\n2GhWz/8aVw9PCnJz8A8KYcrMefjVD77kPTUODtxx/6PMfeFRHnx5FiGRzTn07yYWzJ3FE7M/q5Ld\niqj8N1RCMLqFLx9sT2JK53o09tZxMKWQr/en8UTnerZ+YV46wr10fLg9ifFt/HAp9bEcSinigXYB\ndfgEVfOxLMN6hmcfcH1nEroOCWrUhJS4GGY8dBeGYj3u3r44OGqpF9LQ1qcgN5sPn36Qh159hw69\n+gOwa/0Kvnj9aZ77+AdadL4Fi9nMyp+/4oP/TWLWb2srPbQ4aNxDaJ2c+eqN50hPjiesaSsee/Nj\nmnXoWtuPq1DKgMaeaFTwxd4UkvONNPTSMrVTPdrXd7Xr91z3+iw4ksGLG2IpNlnoEOjKzD4huGvV\ndWS5laoIS7CUUonbrgPSkxKIPXGUeat32SW73rRkARv/mE+rrrcCsGPtX7Ts0oOOtw2w9ena/w62\nLP+djJREAFRqNUPvn8zWFYs5dXgfkW06XvK+Qgj6jBpHn1Hjqm2zMlupOfqEe9In3LPSPlqNiont\n/JnYzv8qWVU1quJj2S6EaFXrlihUID8nEy+/gAoZ9P2DQ+0KjOVmZV40vL5+aDi5WRm210II/INC\naq04mSIqCue5pLAIIY4IIQ4DPYD9QohoIcThcu0KpeRlZ7F52UI2L/3N7o18JVjMZg5t38z6RT+i\nLywgMzWZpAt2Y3auX07T9l1sr5u268yeTWvtUkUaDSXs3LCSJm07lbMzk+iDe2jcqv1/slHBSrHJ\nwtZzeaw5nU1KgeHyF9xEVLYUGnrVrLiO2b5mKd/NeoXWXXsiVCp++egtxj/zGr2Gja72WDkZabwz\ndTxqjYawZq1Z/eu3ePr6M3vKOEY+9CT+waHsXL+cwzu22p1QbtH5Fuo1COWdqeMZOPZBLBYzq375\nGovZzJoF31GiLyI/J4tl331C/zH34+VX8469m222cjy9iNnbEonw0eGu1TD/cAYDG3syrrVfXZt2\nTSAud5hYCPGzlHL85dquFuHNW8uZ81ddvuNVIDs9hefv7sv0b/8guFETAJJjY5g+cTgz56/Cr36D\nao338fOTCQgO5Z7HX0QIgcVsZu60KajVGsxmE7kZaTRt34WBYx/Ew9vX7lqT0cimpQvYvXE1Qgi6\n9htKp96D+PvP+RzavhknFzd6DbubTr0H1Xi2uZtNVIxmyf8tP8MTncucqXklJp5fF8vkTvVoW8+l\nji2sHYYvOLFPSnlp51w5quK8bVH+hRBCDXS4EsNuNHZvXE2HXv1togIQGBpO1/53sHP9ystWJiyP\noVjPwX828tm6/bY3vkqt5s7/e5IPnn6IOcv/rfR6jYMD/e6eQL+7J9i1D580leGTplbjqarHzSYq\nYI0n8XfW2O3QuGs1DIn0Ylts3g0rLNWhMh/LNCFEPtBaCJFX+pUPpGHdgr7pMRkNOOoqpmZ01Oow\nG6u35rZIiZQShwtOL1/JWFeLm1FUAEwWiaO64ltHq1ZVCFa7WbnkjEVKOQuYJYSYVZq0SeEC2t/a\njzcm3cmd//cUnr7W7b687Cy2r1nGi5/8Uq2xdE7ORLbpxOIvPuTciSNkp6cSGNoIJxdXQpu25PVJ\nIynKz6Nxy3aM/d+rpCXE8u+qPynW62nb43Y63NoPlfrysQuGYj3/rlnGqUN78fT1p9fwMQQEh1b7\n2W9WUQFo4e/MxzuTOJtdTFhp2L3RbGHtmRzubKakToVKhEUIcX7r4Pdy/7chpdxf2cBCCB2wFdCW\n3mexlHL6BX0mAu8BiaVNn0gpL5XR/5ojMDScgWMf5OVxg+k1bDQqlZotyxdx+8h7CYlsVu3x2nTr\nxeIvPqD7oBF07XcH+7duYNf6FVikhX53309gSBjbVv7Bk0O6onVypu/d4/EPDmXJ13P5d/VSnpj1\naaXiUpSfx1uPjMHD25eOtw8kJS6G1yYMY+rb82wxMVXhZhYVACcHFY90rMdrm+Lp1dAdT62GLbG5\nhHho6RrsdvkBbgIu6bwVQmwq/a8O6Agcwpr8ujWwS0pZ6THX0jIeLlLKAiGEA/AP8KSUcme5PhOB\njlLKKjsBriXn7XnOnTjKzvUrkFLSuc8gGrWofnY2gMf6d2D0Y89x24iyRHrzP36LvZvW8tGybQDk\nZmXw1NDuvLv4b1tovslo4LX7hzPy/56kUyU5aP/48iOS42KY8tZcmx/nyM6tfPf2S3ywdGuVEjrd\n7KJSnuR8A1ti8ygymGkf6Eqbes61WoalrqkR562U8nYAIcRvwMNSyiOlr1sCz15u4NLctQWlLx1K\nv27IBWjDpi1p2LTlfxojJyON/JwsegwZZdfe7+4JbPj9Z9vr43u206xTd7vzPhoHR3oNG83BfzZV\nKiwH//2bsU++bPfH37JLTywWC8nnzhAUHlGpjYqo2BPo5sg9LX0v3/EmpCqRt03PiwqAlPIoUKWP\n5NLyqgexOnzXSyl3XaTbqNLAu8VCiIvuz94MdYU0pdG1xfpCu/ai/DzU5ZY3jjonivJyK1xfmJ+L\n7iLF4suj1TlTVJBn12Y2mSjRF6F1cq70WkVUFKpDVbabo4QQ3wC/YJ1x3Ie1ZOplkVKagbZCCE9g\niRCiZakwnWc5sEBKWSKEmIy1KmKFAsRSyq+Ar8C6FKrKva8WRkMJa3/7nl0bVlqXQr0HMfDeSTjq\n7N/kJw/t4/vZL5OVmoSDVkf3AcMZ+9TLtu+7unvgHxTKwk/eZdK0mQghMBkN/DpnJlpnF2Y9Npbc\nzAzCmrXibNQRfnj3NWJPHKWkWE9km47sXL+C5+f+aHfPpHNn+PL1Z0iJO4vawYGAoBCWfDOXZh26\n4ezqhpSSVfO/Jig8At/AoEs+Y3VEpdhkYfnJbPamFKFWCboGOjM4wgvNBTlDkvMN/BGVyanMYnyc\nNQyN8MJNq2bpiSzicw0Eezgyoqk3kT6Vi6XCtUlVhOUB4FGsNZjB6pD9vDo3kVLmCCE2AwOBo+Xa\nM8t1+xpr7ebrBiklHz37MFJK7nl8GiqVYNUvX3Nk1z9M+2y+zWcRc/wQsx4bS9+7x9Ot/zDSEuP4\n5cMZJMfF8MyH39rGa9apG9tXL+HA1g2ENW/Fif27sJjNaJ2cuX3kWPyDQti+ZikqlYqju/7hvqdf\nxdnVnbW/fY+jVkdQWNlSJjM1mVcn3EHn3oMY/8x08rIzWTD3bfSFBfxvWA9adOpOctxZzCYjz835\nscKznac6omK2SN78J4mIcH++eKkXBqOZt3/exUe7U3i2Sz3bEiwp38C0DbEMauzF4C5exOWV8Ome\nFIoMZu5r48+o5j5Epet5a0sCz95Sn9YBSlzI9cZlhaU0k/5HpV9VRgjhBxhLRcUJ6MsFwiGECJRS\nJpe+HEYVZ0LXClH7dpKeGM/shetQa6w/yiZtO/PyuMEc2bGFNrfcDsAPs1+l17DRjHvqFQDCm7cm\nvHlrnhvVm5yMNDx9/bFYLOxc+xdPvvsl6UnxxEYfY+KLb/HtzGm8/v0S2yHD8OatMZaUoHZwoG3p\n+BGt2/PekxP5d/USet85FrDWFWrarjOPvP6Bzd4m7ToxZUAnHpvxMQZDCV5+ATTr0PWSTtvqLn92\nJxagddGxaMZQVKUzlJ6tg2gy9ntOZRXbZh9/HM9kcIQXY0r9E+HeOkI8tLz2d3xpugBBuJcOT52a\nXw9n0LqfIizXG5UFyC0q/fdIqQ/E7qsKYwcCm0r77sHqY1khhJghhBhW2ucJIcQxIcQh4Alg4n97\nnKvL6aMHaNvjdpuogDVatt2tfTl15ICtLSMlic59Bttd6x8UgndAIEd2bgUgKzUZQ3Exrbr2pM+o\ncUx66W0CQ8Lwr9+gwsnlLv2GcvZ42a9ACEGHXv05faQsAiDhzEm69rvD7joXNw8iWrfnzLGD9Bg8\nkhadutdIaY/znMoqZmSvCJuoADg6qBnUtSHRGXpbW3SGni5B9nlFwr106DSC9MKyg5Sdg9yIztRX\nqBmtcO1T2Yzl/NLnig4jSikPA+0u0l6+rpCtWuL1iJdvANH7d1doTzp7mtbdetle65ydSDx7iuYd\nu9naDMV6cjLSbDsxrp5eCCHISE7ENzAIs8mIh48/malJGIr1dj6bhJiTePmXZRKz3vOUXZuLmzsJ\nMdF2faSUJJ+L4ZZBl6+3fCXOWi+dmmMxFU93Hz+XRXfPsj81H2cNCfkGu5yu+SVmCgwWuwRFCXkl\neDtp/tMWrsFkrVXtqFGysF5NLvnTLrdE6QM4Siljy39dHfOubTr3GUzsyWNsWrIAi9mMxWJh64rF\nnDy0l679y2YL/cc8wKJP3yOmdJahLyzg27dfwsPbl/DmbQBr5G3DZq2Y9dhYpg7qzMTukcx8ZAwW\ns5lvZk5DX2jduY85fpjFn7+PztkFk9GAlJID//zNP6uWcNvwsnpBd01+hnULf+TIrm1IKTGUFLPw\nk3cwGkq49Y7Ka8SNyX3/in4evRp6sHZ3LAv/PonFIjGZLXzy50FOx2fRqdy5miGRXvx8KJ24XGtC\nwgKDmU92J+PkICguFYLMIiPzdiUzJNLrimzZn1TAQ8tOM2bxSe5ZfJKpK2NIzLs2j0bciFTldPMM\nrDlZQrGmp9wGbJNSHqx98ypyrQXIJZyJ5ss3niU9MR6hUuHlV4+Hp79HwyZ2Zzf57u2X2LbyD3RO\nzhQV5uPtH8grXy3CJyDQ1mfZ95+ydfnvPDH7M0IimnF87w7mvvAoqASmEgOunp6UFBVhKNHToHEz\nkmPP4KjVoXV2YdK0t2nRqbvdPZd8M5cVP32BRqOhpLgYNw8vnvnoOxo2tbetPOVFZcVXa6v98ziV\nqefzA+nklVgwWyzUd3Pksfb+BLnbn4FaczqbXw9n4OSgIr/EjI+zhqwiIxYEHlo1uSVm1AI6Bbnw\nZNdL71hdjNQCA4+vOsu9rXwZHOFFiVnyy6E0dsQX8OPIRjW6/LuZqE6A3GWFxdbR6oD9P6zBcUFS\nyjpJqnmtCct5MpITkVLiGxh0yal7sb6Ikwf24BcUQmCofXkNi9nM1EGdeemLBQSHl2XD37t5LX99\n/xnPzfmBgtxs/Oo3YPWv35J09hSjpzyPoViPf3DoJe9pMpmI2rcDdy8fQiObV/oMF5upXIm4SClJ\nKzSiVgl8nStWEziP0WwhrdCEh07NI8vP8FLPYBp568goMuLj5MC5nGLe3JrAr6OqXh0AYPY/CSDh\nxZ5lQYRSSiaviGFwhCfDm9ZdvZ3rmRpNmyCEeAW4BXAFDmAVlm3/ycIbkMriQM6jc3KmdfdeF/2e\nvqiAEn2RnagANG7ZjrSEWNw8vXDz9Cpta8u+LeuqlLBJo9HQqkvPy/a71PJn6MMDqi0uQggCXC9f\nY9pBrbLNZAoNFiJ9nHBQC4LdrcGCkT5OFBks1a4fnZpvpHe4RwWbmvo6cSZLyQd/NajKb+tOwAfY\nAPwJ/FXO/3LDk5YYx8lD+2w+jothsVg4d+IoZ6OOYDGbASguKmDzsoXs3bwWi8Vy2fs4ubjh7ObO\n2agjdu3H9+2gflhju7aofTtp0LgJNcXlfCpDHx5wye9JKTmXU8ypzIr1baqDm1bN0bQiu7YjaUW4\natVEZxaz5lQ26YVlPpKEvBKiM/SUmCr+bBt4aNmfbB/BbLZIjqQWEeGjJTpDb+dvKTCYiUovstuR\nytabiEovIrf40oXhpJTE51rtMJov/zu+majSUkgI4YbVz9IDGA2kXu4QYm1xtZZCBbnZfPbqU8Qc\nP4xvYBApcecY+dDjDBn/iF2/00cO8OkrT6BSqRBChdFoIKJ1B/ZuWoOnrz/FhQVYLGamzvzkkrOV\n86xb+AMrfvqSR6a/T1izVhzd/Q9fzXgOL796PDrjQ/yDQti1fiWLPnuP6d/9Sf2Gjf7zc1bHUXvh\nzCUut4SPd6diQOCq05CZW8zk9n50uKBERVX44UAaG8/m8mSXQJr5ORGVoefjHUkIITCYJf4uDqQU\nWCv/mc2S9CITnjo16UUmHmjnT++wshlKtt7EoyvOMCjCi6GR530s6RxJLcQiIcDNkSy9ifquDjTy\n1rExJpf67o6k5Btp6e+Ms07N3qRCGgW6czopj9saujOxta9dxcHUAgPvb08iS2/CzVFNlt7EQx0C\nuDXU/WKPd0NQ00uhlkBPoBfWU87x3ARLoa9mPId/UAhPf/A1GgdH0pPimfXYOAIaNLSV2SgqyOf9\n/01i0rS36dR7IEIIDmzbyMfPT+bpD76mTffbsFgsbFj8Mx+/MJmvNh5C43jpJUJybAzuXj789MHr\nZCQlEBQWgYe3H4Gh4cybNpW8rAyatOvMi5/+ctVFBeyXRUazZOY/Sbz1SE8mDmqOEIJthxMZMW0Z\n7/ZxrNJSqDwT2/mjEjB3dzKFBjMujmrUKkG7QFce6xSAo1pFRpGRlzbE0chby9t9Q1GrBLE5JUzf\nHE+QmyNNfK1b8l5OGt7qHcJHO5NYHp2NSoC/iwMalWBG7xAaeGgxWyQLjmSw9kwOnwwJx9tJQ4nJ\nwtxdyZzONXJu0YO4u2jJyitmxEvLWBadxZ3NrL4ZKSUztyZye5g7w5t6oxKCmKxi3tgSTwN3R1uO\nlpuZqoT0vwNsAeYCe6SUxsv0v+7JyUgjat9OPl2zB42D9Q3iV78Bd01+mo1/zLcJy+7SLPid+wyy\nXduuZx/a9exDWoJ1R16lUtF/9P2sX/gDq379hmETH7voPU1GA1tXLOb9PzbZ+U5OHNjN97NesqVN\nqCmudEv5vLjsTy4grL4nDwwu22Hq2TqIcf2asvlsMmNaVP/U74S2/kxoa02YlVpgYMrKszzcwd+W\nrc3X2YEH2/uz9ESWbfYQ6qlleBMv1sfk2IQFoLGPE58OKRPfj3YkEenjZCs9qlYJ7m3ly4aYXAoM\nZrydNGg1KiZ3rMcjK2NsQX7e7jrmPHk7w55fYhOWExl6LFIyoqm3zWke7q1jcIQX62NyebiDIiyX\n9bFIKYdIKd+VUm6/GUQFrMsgdy+fCgcJfQMbkJ9ddrwpLyfrok7beg0akpuVadfmHxRKZkpihb7n\nMRQXYzGZ8PCxz/LuV78BeTV8ovtKReU8Qx8eQF6JmYaBFaf94UGe5JX8d39DRpERrUbg7GC/+Rjg\n4kBeidmuzd/Fgdxi+7YLyS024+di/zmqVgn8XDR247k6qnBQq8gvKvtTb1jPnZxyr/NKzPi7OFTY\nibPacWmfzM2EsqF/EeqFhKMvLODciaN27TvXLbcrM9qsfVf2bVmHoaSseLfJaGD7mqV2dX8KcrM5\nvnc74S3asva379m5bjmGYj0MuBE/AAAgAElEQVRms5kf3nmVF8f055uZL+LfoCEHtm284J5/0azc\nWP+V/yoq55n6eH/W7Y0jr7Bsl8Vikfy24QTNff/7J3aEtxNmCUdSC9kRn8/y6CyiM/RsOpdLY2/7\n8f+Jy6elf8W0D9vj8nh6zVleXH+OQFcH/onNt/t+aoGBuNwSzmTpmbUtgZ8PpbEvsQAnrYZ63mXj\nLdx0klaBZX6jJj5OnMjQk6MvExEpJf/G5V3UjpuRKsexXCtcLeftPyv/ZMHctxn2wFTqNwxn99+r\nOfTvZt74YaltqSKlZMaDd1FcVMCIh55ACBXLvv+ElLizNG7ZjgH3PEBRfh6/f/EBZpP1E8+6TIoj\n7lQUxpISnFzdaNO9F6cO7yctMQ61xoHhD0yxOW+3/LWIV75ceNkkTFWhpkTlPE/N28KmfbG8cF9n\nXJ0c+ezPg6Sn5PBqz/oV0iRcCZ/uSmZLbB4NPbWEeenYm1RAocGMs0bF2NZ+eDtp2HQuj9icEmb3\nC7Gb3Tyx+iwp+Qa6NnBDb5LsT8rH2UFN+0AXeoW6k6E3sehoBnklVn9Ox/ounMkqJjHPgEXAy+O7\n0K1FIJsPJPD50oO81iOI8HKCtvBoBlvO5XFXcx/cdWr+jsklpdDIrD4haG/Q4wO1EiB3rXA1A+RO\nHNjNhsU/k5OeRmSbDgy45wG7pUpWWjIvjO7HkPGPEH1wD0hJ03adWf7TlzRq3prEc2dQa9QEhoRT\nVJDPK1/+ZltePXNnL4LDInny3S9seWp/mzebjX/Op9PtA0lLiCMkohkDx066aPnU6lLTogJWYV20\n6RTzft6O0Sxp56+jfyPPi2awvxJe2RhHh/oujCz1bZgskje3xOPr7ECh0UKhwUybABcGRXji4lgm\nKr8fy2BJVBbzBofhUxqgdzqrmBfWnWNAY0/i8wy4OaqJSi8i1FPHq72CbT6bRUczWBadxa1hniQX\nmgh2dWBIYw8C3So6o3cn5rMxJpcio4V2gS4MbOxZYel2I1Eju0JCiOVUkkpSSjnsUt+7UWjarjNN\n23W+5Pf3/L2GTrcPZMSDj9u1Z6Wl4BsYzLTPfwVg1mPjuOP+yXY+m5z0NP733ld2ya+HT5rKyp+/\n5K7JT+PtH0hNURuiAtagszG9IxnTO/KKInQrI0dvIia7mNdvL0sqqFEJRrfw5dv9qXw4MOyS1649\nk8vgSC+bqAA09tbRqp4L8XkG3uxtFep7F59k7AXbyCOaebPoWCb9GroR7l15kqnOQW50DlKSZ1+M\nynaFauev8QbCZDKidqgYsq5xdLQtfcCa/vH87tJ5LBYL6gvazqdfMBlrzgFYW6JyIVcSoVsZZilR\nqwQXLqg0KsFFYuLssEiJw0WWYg5qFSUm+/2HC5dsaiEQAopN19dM/lqjsmTaW66mIXVNdnoqm5Yu\nICXuHA0aNeG2EfdQkJfD5qW/kZORRkTr9vQYMgpdudywHW7tx/SJI7jz/56y+V1yszLYsfYvXiqd\nrQB0vH0Aq3/9hqy0FE4e2ouHty9unl6s+vkrJr30tm13YeMf89E5u7J1+e+kJcYRGtmMXsPH4Oru\neUXPNCrrXX7bcop1e2Jxc3JkwoBmdGhS8RjAqfhsnv50K2eTc6nv68q7j/bE203LtyuPcS4lj/aR\n/kwc2BwPV22Fa79Ydpgvlh7CaDJzR4/GdLHkcTBFz86EfDQqQY8QNxp5OfHjwVSOZxajVQuGN/Gi\nZ6hHhbHK4+PsgL+LA9ti87itNPhNSsmKk9l4aFVMWnoKi4Rgd0eevyWYuLwS/k0owCwl4Z5aVp3M\nJsDFgSNpRTioBC39nTmYXMAdTTyZszMJV0c1Oo1gaVQW/+sWWPY7iMnBQSVofoETNjnfwPozOWTp\nTTTxdeL2MA8S8wz8fbZ0KVTPhe4hblfsWyowmNkYk0tMdjH1XB3o18gTAaw/k0tygYEwTy19wj1x\n014fS62qnG6OAGYBzbGWAgFAShl+meuqUldIC/yEtWRrJjBGSnmusnFrw8cSdzKKWVPG0fH2ATRu\n2Y6ofTvYv20jSLh95L0EhoSxZ9NaMlMSefWb33FxK3tTLP/hc1b/+g09h4xCqFRsW7GYPqPu486H\nn7L1SUuMZ9o9/Qlt0pKeQ0eREhvDukU/YjabCGvaig639Sf6wG6O7fkXIVT0Gjba6rzd9Q/RB/cw\n/ds/8KlXv8rPMyb3fYwmMyNeWU5ugYHx/ZuRmafns6WHeXVCFx4Z1srWd/PBBIZNW8Yd3cPp1ymU\nf48kMn99NM46DRMGNKNVuC9rd8ey/2QaW+beTaBPWTa3wc8vYefhRIY39cbJQcXKU9kUmiRuahgQ\n4YXJLFl1KodCo5lAN0f6hXuSVWzirxNZdG/gyuNdKn+mM1nFzNgST5sAF0I8texNLCA+twSzhGFN\nvPB1dmDdmRwS8gx4uznyxOiOOGk1fLJ4L/FpRXjp1Axt4k2xyczSE9kYTBYifZ3oGepORpGRVdFZ\nmKQgyN2Rbg3cOJWpZ39yIWNb+dr8OgAHkgv5cEcSfcM9CHJzZGdiATFZxVikZHCEF+46NZvP5qHT\nqHilV3C1xSWjyMi0DXE09XWibT1nzmSXsOVsLkIIeoa60dhbx+HUIo6lFTGrbyh+Lpc+2Fmb1Kjz\nVgjxDzAda2rKO7DmwBUXisRFrqtKXaHHgNZSyslCiHuAkVLKMZcYEqgdYZn12Fg69x5Mn7vuA6wn\njR8b0JHH3/6EFp1vAayflp+/9j/8g0K4a/LTdtfHnYxi18ayZNoXlgJ5Z+p4NA6OPP3hN7ZPxpOH\n9jHr0XsJa96atIQ4PH39KMjP486HnrDLl7Lwk3fIzUzn4elVW9KcX/rMX3+CL/86zN8f34Wm1Jl6\nJjGHzpN/48yCB/AsnX00Hf8j9/VryisTutieM/K+H5n5UHdG3152IPKZT7diMJmZ96Q1HeaeEyn0\nmrqIL+9ohJeTdeJrNFuYsvIsD7b3p0tp4a68EhOPLI/h/f6hBJUeLozPLeHptef4qty1lyK/xMyW\n2FwyCk34uWj4/kA6Hw5sSEhpoJtFSl7aEIeTlyt7vrKm5Xzjhx18+ccBPhkcZnMkZ+tNTF5xhnmD\nwvAvjQqOyS7m1Y2xNPZ2Ij7PgLtWzRNd6tn5VixS8uiKGB4tV+w9v8TEg8vOMGdQmM2pa7ZIXvk7\njgGNPG0zrKryye5k3B3VtuBAgMdXxTC8qTd9w8tmq/MPp5NRZOLJrjXnf6sO1RGWqrjvnaSUG7GK\nSayU8nUukkn/QqSVy9UVGo41Mz/AYqCPuMoVn0xGI8f37uDWYWVv5uTYGLROTjZRAaujsvfIezm0\nfVOFMUIim3H3o88y+rHnLlpfKO5UFP1GT7ALqIps0wE3L2963zmOT9bs5uUvF5KTlkL3gSPsru19\n51gO/lvxnpdj7Z5Y7h/Y3CYqAI2CPOncrB5bDiaU2Zaaz/8NLbM5I1dPZq6eu3rZb28/NLQla3aX\n5ff64q8jtK/vaicMDmoVAyM8OZRadpjQXauhW7ArB1PK2hp4aAnx0LIhpmIZkwtx06oZGunNxHb+\nxGSXEOzuaBMVAJUQDI70IiYh29a24t8YBlywO+XlpKFjfVc728K9dAS6aRnd0pfvRjTm40FhFRy2\nSfkGLFLSJqBsaRSVoSfSx8lup0itEvQJ92DfBYcfq8L+pEL6Ny4TkBKTheR8I7c1tBeo/o082Z98\n6cOw1xJVEZZiIYQKOCWEmCqEGAn4X+4iqFJdoSCsZ4+QUpqAXKwnqS8cp9bqCqlUKjQOjhTll9Xb\n0Tm7oC8owGS0d/Tl52ajc6p+Yme1xoGCvBy7NovZjL6wAHdvn9I+GoRKRXGR/R9Ofk42Oueq3bO8\no9bVyYHs/IopArLzi3FzLntDOGhUZJXrp3PUYLZICovtnz0zT4+rrmwK7umirRABC9YIV6cL4jjy\nSuzbpJTkG8x2aSirgodWTYHBXCEHbn6JyW5nx1lXMTrX2s+Mk0NFO8q3XYiTRoXeKO0cxjqNinxD\nxfELSio+e1XQaazJrs6jEgKVgCKjvZc6v8SM7jqJkamKlU8BzliTXXcAxgP3V2VwKaVZStkWCAY6\nlx5oLM/FZicV1mZSyq+klB2llB3dvGq26LZKrabH4Dv5bd5sW8oDDx9fHHU6/vr+U9sfcWF+Lku+\nnkPPO+6q9j063j6A3z97n4Jc66eqtZ7PN0iLtG1naxwc8avfgAVzZ9vSLBhKivn9s/e4dejl73nh\n7s99/Zoy78+DxKWWCebvm0+Rll3ErW3KjiG0i/Djuc+3YTBan91ZqyHQ24XxM9cy5IWltJz4M2Nn\nrOK5z7YxYUBZPepp4zpyOlPPgXKf0Il5BtaczibCu2xGcSytiEOl6QrOs+lcHvklZqKzi3lqfRxv\n/pPEnsQCojP0zN6WwJSVMczalsCJDD17Ewt4858knloXR1aJifxSJ+d5svQmfj+WSZeWZc90b98m\nrDmdQ0JemWAeTCkkKkNPRLkgt7VnctBpVIR5VnRKn8fH2YEwLy1/RmXa/hYaemhJKzSyLbbsZ5te\naGT5yWyEgKfXnOWp1WdZeDTDlmqzMnqHeTD/cAaG0tQLahXUc3Xgx4NpWErvaTRb+OVIut0p7muZ\n6mSQc8e6wsm/bOeLXz8dKJRSvl+ubS3wupRyhxBCA6QAfrISo2rDx1JUkM+c5x8hOfYs4S3acPLg\nHty9vMlITsLT14/Aho04vmcHQqXirV9WUK9Bw2qNb7FYmDHpTs6dPE7Tdp1JTYglPzuLsGatSIg5\nSZN2nTl34giePv4gBDkZqTRs2oroA7tp0ak7k9/4sMJ2dXkutaU8Z/EB3vhhJz1aB5GZqycxo4Al\nb91Bu4iyCeeaXecY++ZqVCpBt+aB7IlOJV9vwFXnwIdTetG6kS+rdp5j9vw9/P3xKLtrP11ykOc+\n20qwuxYnBxXRGXpcdA4UG0w0D3DBaJaczijCIq2+ihb+zmQVmUgtNKBSqXjpvk7ccUsjjp/L4qk5\nmygqNjC+jR/NfJ2Jyijil0Pp6HSOfPzkbbRo6MOK7THM/GkXFovEz8UBHycNURl6NEIgNCraRfij\ndVSz42gyQkoMJgtN/JwoNlqIzy2hhZ8z0Zl6Wvo7k1FkpMho4ZVewbbEUpcio8jIW1sSMEtJkJsj\nR9OKaFPPhegMPd5OGtx1Go6lFeHrpCHA1YGRzXxQCVgWnU1esYk3e4fYzaguxGSRzN2ZzKHUQpr5\nOXM2uxhPrRqVSpClNxHupSMqvYgW/s481bU+Duq6qQ9d087bjsD3wPlIoFxgkpRy32Wuu7Cu0Drg\nHSnlinJ9pgCtyjlv75RSjq5s3NqMvD134ijJsTHUCwlj9pT7mP7dn+RlZ5KTnkqjlu3YtORXCvNy\neWDazCsa//TRg2xfsxT/oBD63j0BjUZD4tnTxJ+Kwj84hLBmrQE4G3WYtIQ4GkQ0I+iCJE8Xcrk4\nlYxcPZsPJuDu7Mjt7YJx0NgvP/o/+yfj+zfD3dmRTQcS6NTMnxe/+JffZwyha/MyJ+GcxQfYcSyZ\n36bblzHJKyjh48UHKCw2Ehbowfz1J1gxexibDiaiUQtubR1Eqwd+4e3/687+k+kEeDtz4GQaLcJ8\nbA5jgHYP/MzAIB23hJQdbNwen8fKeD2Hfphga5v1y27W/X0MnRBkFZvoEOjC6thCDv0wnm2HkzCY\nzPRuF8zg55bQxgXSCk1oNdYtbmdHDVmlCZzcHNW08Heu9A1fHiklURl6svQmIn2c8HdxwGSRHE0t\notBoRqMS/HQonbmDwmxjWqTk2XWx3NvSl05Bl89Rk5BXwrmcEgJcHGznoc5kl5CcbyDMS3tZAaxt\najQfC/Ad8JiUchuAEKIHVqFpfZnrAoEfhRBqrEuuRefrCgF7pZR/Ad8CPwshTgNZwD1VMbq2OF/c\nPf70Cdw8vanfsJFd3pP2vfrx/ayXKxmhchq3bEvjlvZlr4PCGlcQj/DmbWzZ+yujKsFvvh5OFRyx\n5dkdlcqi14fg6apleI9GpGQVYjBttRMVgDu6hzNn8YEK17u7anltovVg5otf/sOQbmF4uOoY0aPs\n5zakWxhZeSV8MOVWAFpN/JmXxttHNB+Py+bVzvZ2dqrvxnv/JiGltDm+h93SiG+WHmJOf2v07MqT\n2Qzo0hB3Fy1DupVF4w6/NYLd204wsZ29O9DbSWMnXlVFCEFzP/vYFo1K0DbQ6v/6MyqTDoEudkKl\nEoJO9V04mamvkrAEu1cUj8beugqHLq8HquJjyT8vKgBSyn+Ayy6HpJSHpZTtpJStpZQtpZQzSttf\nKxUVpJTFUsq7pZSNpZSdpZQxV/ogNYmHjz85mekUFdg/ZsKZk3gH1M1W34XUVERtsJ8rx85a/QeF\neiMeLo4YTRaSMgqwWKxtUkqOncsk2M8Vs9mCvuTikcHBfq4cO5dZof3wmQyC/FzJyium2GAiyNfa\nT0pJUbERi0US4OlEXK61nEmxyWJN+5hXQoCnE2azJCOnCIvFwrFzmfg4Wx3MJSYLPs4ajl6kltHh\nU2n4OF3cOVxismD+D2k0L4avkwNxuRXLi8TlGvB1dsBgtlxR6k5LuZ/H9URVlkIfYXXeLsDqWB0D\nZAN/AEgp91/66prnah1C/Py1/2E2GZn44lu4unsSc/wwHz7zEJNf/5CWXeokK6eNmgzT//KvI7wz\nfw8mk5mMvGI8XBwxWyx4uTuRW2ggr9BAsJ8r+XoDHSL8+OdIEsUGM63DfHh/6m12juCsvGJaTPyJ\n9x69lbF9mmC2WPh0ySFe+24HTloN2fklqFUCN2cHzGaJt6uWhMxCXLQatA4qjCVGQJBvMOPmqEZg\noUQKSoxWIXByVFuTYvvoOJ6hx2CSRPg5kVlk4pmxnXhiVFvUKhULNkbz1Jy/mTOgod3O0/H0In4+\nmsWp9CK0GhW9wz24r6VPjZxGLjFZmLIyhpHNfBhYunW86VwuPx5MJ8TDkRMZxagF3BLixoPtA3B1\nrHxHTErJX9HZLD2RRX6JGV9nDfe08q2wBX01qWkfS2VBFFJKedmYlprkaglLiV7Pj+++yu6Nq3F2\ndcNiMTNm6ov0HDqq1u9dGTV99mfBhhM8PWcTz3YLJNJHx7mcEt79NwmV1oG1H9xJkwZebD6YwIhp\ny2jh58wjHfzx1GnYmZDP1wcz2PrJaJo3LIsQ2H8yjckfbCQuLR+zRRIa4EZUbBZfPduXMb0jycjV\nM3bGavYcT+b5W4JoW8+ZlAIjb2yOx2SRvNAjiAgfJ05nFTN7WwIqAa/fHkKgqwOHUop4999EGod4\nsfKdkfh5OrFo00mmfLiRBh46EvJK0KhU+DhreLitLxE+ZTEp8bklvLolkc+e6cOoWxuTklXEk3M2\nkZOSzVOdL1/toCok5JXw6e4U4nNLEELg46whs8jE2Fa+9A33QG+S/Ho4ndjcEt7uE1JphcelUZls\njc3jya71S4VJz4c7kpnUzp9uDerm4KOSNqEGKcrPIz83G996QXY1muuC2jhQ2HbiT9wV5mrzFQDE\nZBUze1cKiX8+jBCC+LR8Wk74ke+GNbL7dF90LBOXBv58/mzfCuMmpOejUasY+cpyerYO4t3JZSVI\nhjz3JxEqI30blQWFPbriDI93CbTzY0SlF/HxzmS+vKPMX7MxJofF0TnELylLaj7ty22cPBTLiCZe\nmCwSX+eKZVm/OpBG+86Nef2BsjK3+hITDUZ9zXt9GtRomHxmaba5TefySM438HiXsuWzRUqmrDzL\nk10Daep78dPTFimZtPQ0M3qH2AUD7kks4PdjGbzbv2GN2VodajTyVggRIIT4VgixuvR1cyHEg//V\nyOsFZzd3AoJDb0hRAYhJySPCx945GOalJTOvxBbbcjY5j1BvpwpLhsbeWqLjLh6wGOznRj1vF9Jz\n9BUcwWcSc+1mEwApBUYiLoh6jfRxIrXAaOdfiPBxIk9vH7zXpUV90vRmvJw0+F0kZSRAWpGZLhfY\n4aTV0CTYk5SCmi296uPsgI+zA8n5BiIveE6VEDT21pGcf+l7FpssFBktdqICEOGjIyn/+sgOW5XF\n5Q/AWuD8ibGTWIPmFK4SFxMVKSUHT6fz75EkSgxXnmaheag3h1Pt6/kcT9dT38cZx9KkRU1DvDib\nqafAYCY+t4RjaUXojRaOpOlpF1lxGWEyW9hxLJm90akE+7mybq99qe/mYd4cSrUPfQ92d+TwBW2H\nUgtp4OFoJxSHUgrxdrMXwvV7Ygl2rVz4G7hq2HiBHTkFJRyPy661bdyGntoKz2SySI6lF9GwkqA8\nJ40KD52G6Ay9XfvhlCLCvOp2y7mqVOVj2FdKuUgIMQ2sofdCiMozFyvUGBcTlRNxWdzzxir0JSY8\nXLQkpBcw78nbGFXJtvKleG1iN8bNWIVFSloFWLdG5+1KRuPowN/742nT2I+1e2KxSAuProhBoxL4\nOmuIz7WeoTn+qn2+r/V7Y3nwnQ34eugwmCzoS4zsPpFKwwB37h/YnOTMQmLTCll7LhNnjYpOQa7E\n5xkwWOCjHck83qUezfyciUovYt6uZNQqwZHUQkI9texOLODnQ+k0DPRg/8k0An1c+HntcX7/O5r3\n+jS4xBNaGdTYkxdXH6e+rytj+zUlPi2fp+dtoVeo+2UPQl4pvcM8+Cs6m18OpzOwsSeFBgvzj6TT\n2EtXaYkQIQT3tPThwx1JPNIxgMbeThxKKeTbA6k8063qp9zrkqo4bzcDo7Ce9WkvhOiKNdCt8upb\ntcS1Wru5NriYqJjMFppN+Inn7+3IQ0NaIIRgb3QqQ19cxuY5d9E0pHpHHt5dsJcFG6LRagTR8TmE\nB7qjcVBjNFtITC+gQG/Ex11HVk4RQyO9ubeVNeNacr6B59fH0qtDCEtnWsUlKaOAtg/OZ9EbQ7it\nbTBSSv7YepopH/2Nh4sjiRmFODqo6dqsHtPu68RbP+5kb3Qa9b1dCA/y4MSpVNTCejQgyN0RvdFM\nbrEZiTXxkrtWjUTSzM+ZuHwTecUm2ga6MKaZd4Wi8xcjLreERVHZHE4pxF2noU+oG8OaeFU5SO5K\nSC808uuRdPYmFaLTCHo19GB0C58qpe/cFpvH0hNZtgC50S18aVOv+mfVaoqa3hVqD8wDWgJHAT/g\nLinl4f9q6JVwswjLpXwq6/bEMv27Hez43D6W8KWv/8Vikcx+pHpb4RHjfmDR64PtQvXjUvNo99Cv\npC97BJVKMP37Hcz5bS8/joywexOuPJnFgqOZ5KyZCsAHC/dxMj6HL5/tY3ePoS8uY2zfJozt2/SS\ndgSO+JLXbgm01f0B6y7LSxvi+OnOspnY7sR8lkRlMatvaLWeU+G/U6ORt1LK/UKIXkATrIcGo2+W\n+kJ1RWWO2sy8YhoEVNxuDAlwY190WrXvlZGrJ8Tffrz6vq4U6I2YzBYcVWqi47LwdNJU+GQPcLGf\nJWTk6gm5hG1ZecUV2suTXVBSYWfGz9mB/NLTzOf9LP7OFz+5rHBtccn5mBCikxCiHthSGnQAZgIf\nCCFq9oixgo3L7f70aFWfv/fHk5lb5tizWCQLN56kV9vgy44vpWTn8WQ+WrSfBRujubV1EAs2Rtv1\n+X3zKTo1DWD59hg+XLSffh1DSCkwknTBTsbGs7noyqVS6NU2mMWbT2E0lb3xC/QGlm+Pob6vCx//\nvp8f1hwnt6BiOoeeLeuztdxpYbAuBRp76+yct1ti82gVcHPU7jFZJLsS8lkalcnBlELbSefrgUsu\nhYQQ+4G+UsosIcStwG/A40BboJmUsvr5A2qAG3kpVNUt5Ve+2c7Sf87w7D0d8HTV8s2KoxTqjax9\nf6RtJ+diGE1mxr21hgOn0hnSNYyTCdkcPJWG2SKZNLgFt7VtwO6oFOb9eRCtg5rIBl60buTL+r1x\nxCbnoCl1Kga4OLLxbC77kwtY+/6d9GhjFTSLRTLy1eXkFxp4bGQbSgxmPlq0H5PJTHJGAV2CXckt\nsXA8vYg/Zw6jZ+uyqN39J9Po//Qf9A9zp6mvjhMZxaw+k4PFbOGu5j6EemjZnVTA7sQC3qnD9IxX\ni8wiI69tisddq6aRt44jqUU4O6h4tVdwnZUYqamlkFpKeT5IYQzwlZTyD+CP0uRNCjVIdeJU3nyw\nG52b1ePndVEUFhsZ0jWMSYNbVCoqYA3fz8or5tgP4219v1l5lHl/HKTEaOaDRfuIDPaiaYg3Q7o1\n5IWxnQAwGs3UH/U1d3QPZ8PBeIqK82gR7ksjtQNx6WWJqVQqweI3hvDT2ih+XHMcjVrFbe2CWbYp\nmnkDQ21viP3JBdzz+krOLXrQdtq6faQ/O7+8lzm/72dzTAbNwwPZ/cJg8goNvPTuag6mFBLh48QH\n/RvW2i7OtcTX+1Lp3sCNca2tdawsUjJnZzILj2byQLsq5VmrUyoVFiGEpnQZ1Ad4uIrXKVST6ga/\nCSEYdks4w26pNJ95BX7ffIqX7utsJ0APDGzO9O92MHVkW8Lre5BTUELo6G9Z98FIW59DMRn4ejrx\n7Qv97JYlv244we+bT9k5ZR00ah4c0pIHh1hzet0zfQWDwt3tPmXbB7riEZXN9qPJdsu3xkGezHuq\n4gmRtd9OrPG6RdcyRrOFfcmFPFEut61KCO5q7sMbm+OvC2GpbM9rAbBFCLEM0APn0yY0xpqTRaEG\nuFp1f8Ca8FlzQZIglUqgUaswlWYvs1isjtLyjlqzWaJRqypEtDpo1LbrLoXJbOFieYk0KnHZa8sz\n9OEBVe57vSMBKa01jsqjUQnM14mbpbK6QjOFEBux5lVZVy6rmwqrr0XhPzAm930yc/W8s+Io+6JT\niGjgzcN3tCK0XsVcIUfPZvDdqmOkZhXRo3UQE/o3w8Wp+j6GET0aMfePg9zWNhh1aRzF4i2ncXVy\nYPHmkxw9l0VksCctGnoz+9e9FBYZiEnKoUOTABLSC9i4L44+Hax5UAxGM58uOcj4/s0quyV39W7C\nm19to2eouy1240SGnq21ZKEAABVeSURBVNQCIz1a2Qd7HT6TzjOfbuVcUi6hge68P6UXbRuXlbQ9\nLy5Vmb2YLZKdCfnsTizAUS24NdSdVgF1FwNSHRzVKloHOLPqVLatDImUkmUnsugafPm8LtcCtXYI\nUQjRAGvNoHqABauPZs4FfW4DlgFnS5v+PJ+35VLcCM7bMbnvE5uSR48pC2nuraWVn46zOQa2xuez\n8t2RdG5Wz9b3z62neeyjv3l0eGvCAj1YvOUUiekFbPp4FO4u1QvvTkwvoN1D8/H3cuae3pEcPZvJ\nyh1n0WgEd98WSa82weyOSuHHtccxGEwMaORJIy8du5IKOJhShKOjhhE9GhFaz43Fm0/TONiThdMH\nVchKVx6z2cK4N1ez60gi3eo7k2v4//bOPDzK6vrjn5NNSEjYEiQsgRAWZZG1bMomuKBRsCogWpVi\naav2p1KwtrbqT6ytVlHbUnCBgkoVRNAKqBQUsIKoBMIqggQCJEBCYEL27fSPeQmZkG3CzLyZ5H6e\nJ09m3rnvnTN5km/uPfcsJXx1LIs3Hx/rUphp5eYkJjyxkuEdI+gZ1ZjdablsOJTJO0/ewLgyRaNK\nx1chLiWqvPBlCieyC7k2rhl5RSWs+v40V3dqyqSekW79zOwi9WwBf/gsmU5WoafE4zlkFRQz6+oY\nt4uQe4o6kd0sItFAtBUHEw5sBcar6p4yY0YCM1Q1vqbz+ruwnNv63P3MxxSdyGByr/O/6OuTHGw6\nXcymeXcAzlOc2En/ZPms+FKxUVUmz/qE3nGRPHbnj9x67ycWbCb5ZCa3j+jKpl0ptIlsQkyrcKa9\nsJajy+4jMDAAVaXThPnccVlThrY/v3pauD2NJm0j6dO1FemOPEb2bcfofu2rTP0/h6qyMfEYa745\nTPPwRkwe0402ka7/eTvc9jrXxjRh3GXnIxk+2pfB6kNZHHn/ZxXOW5m4bE3JYtH2NF68rgPB1irp\nTF4RD646yOzrY2nlJydKeUUlfHE404q8bcTgduG21bsFz5emrBWqmgqkWo/PishenO0+9lR5Yz2m\nrD9lzTfJPDuyrcvrwzpEMHfrfs7mFBAeGsLOg6doEd7IZQUjIkwZ250/vf2N28Ky5pvDvHD/MK7q\n1dZltRA2J5jvj57h8g4tSHfkcjorn8HtXAPdRsdG8NzXR1n4+PVuvec5m0f0aVdlnE1KRg7XjHL9\neYzp1Iz5CScpKSkhIOBCd2Bl/aK3pWYzsmNEqagANGsURP82TUg8ns01cbVrWetrGgUF+I2t5fFJ\nkxIR6Qj0Bcr3FQIYIiKJIvKxiPSo5H6v9RXyFeWdtOGNg3HkuWYlZxeWECBCiFWeIDw0mIyzeRSX\nc3KmO3IJD6s+N6Y8EaEhpJ1xzZgtKCzGkVVAeKjzv/i5vkLl21Zk5heXjvEGQQFyQURtZn4RwYFS\noaicoyKnbuPgAByV9DwKraKHkMFzeP2nLCJNcJaxfFhVM8u9nAB0UNXeOPORPqhoDm/2FfIFFZ38\nTLmxJ4t3nSLf+gMuLlHe2pHGrSM6c0mIcyHZpV1zYltHMHtpQmlNknRHLn9e/C33XFe107Qi7r6+\nO/+/cAunzzrD61WVZ976mtBGQUQ1ddYNaXxJEK1bhPJmYnpppGduYQlL9mYwNb5XpXNfLL07R7Fg\n20kKrWOPohJl/rY0esVV7xMpLy4jOzblsyQHyY7zEb4JKVkcPJ3HgDb+4fz0d7xaQc7q2bwS+FRV\nZ9dg/CFggKpeWB3Zwt98LJUdJ3+5M4UbH12BAD0uDePAqVzyikp45aFR3HN999Jxh49nMv7xjygq\nLiG2TVO+3JnC/eOv4OmfDqmRf6Msn209zPjfryQgIIBhV7Th+yOnSTuTS3jjYAqLlcE9otm67wTd\n2jcnOyef5OOZxDZvxJ4T2YwbFsdrM68pPU3yNBmZefSb+janM3PpGhnK9+k5NA9vzLdvTCayWc1C\n+Mtui9YfcvD61hPENW9EXrGSll3Io1e24fKohpEO4A3qivNWcPZlzlDVCgtDWblIJ1RVRWQgzv7N\nHXzdsMxbVBWjEv/Yh4wfFsfIPu3Y8UM6cVZw2i9mr2PPItc+z6rK5t2pnDidw+Du0US3rN2xaZ+p\nb3Pz0E5Mu7kXX+89QZvIMFpGNKLv1MWse+lWjqVn06VdM3p1ikRV2bY/jUPHM+nbJYrYaN8UcV65\nOYkvEo9yVa823HTlhadB1d5fRlxyCovZdTKHkIAAerQKtdXxWR+oE85b4Eqc7Vh3lkkB+B0QA6Cq\n84DbgF+KSBHOILxJVYmKP1Fd4Nu3+07w+swxRLcMo3Nbp4NOVUlJzyYzu4CmTc4fJYsIQ3tefIGf\n4xk5xA/tRLuocNpFnXfORjZtTMqpbH48/Hx/IxGhX9dW9Ovq2yjP+CGxxJdxLLt9fxmHbmhwIAPb\n2lN4uqHjzVOh/1Jxb+ayY/4O/N1bNniLwoJ8iouKKm3WXpNo2phW4exKSndZfSSlZnJJcCCNQgJx\nZOUTERbi9nanKpo0DmZX0imXUyZHVj7pjjx6lqm0byclJVp6KhZQywJMlZ0WGXyHcZG7QfZZB/Oe\nnM60UVfwizF9eGrKLRzY5dodsKYh+v93W18e/tsG9h52nnIdS8vivuf/Q98uUXSctICYCfPpPHkh\niz7x3On8A+N785t5X7Blz3HA6Qi+989riI2OoEv75h57n9qgqvxjRSIdJzo/e4eJ85mzItHvGnUZ\nnJhkQjd45dFfEtWmPX9d9RWhTcLZ9MmHvPDQFJ55exWR0W3dyvu565rLOHM2j6sfWUZwYCA5+YX0\n6RyFI7uA9S/fTreY5ny1J5W7nvmEJo2Da1XPtjyDurcmr6CIa2csJygwgNz8IiLCQrhpaO23Hp5i\n/urdzP1wBx/96WZ6d44i8UAaP/njpwQHBTDtJvdPo8yqxV7MiqWGHNq3m+PJSUz93bOEN2tOYFAQ\nw+Jv5cqx4/ls+eJazfngj/tweMlUvpwzgUPv/pTdh06x6LfX0S3GuXoY3D2al381gtlLPdNs8pVl\n2/nL/cNJ+2Aaq58bx8F3p7Bn0d0s3/hD6RG0XcxeksCrM0bT28oN6t05itdmjubFJVtrPWdDSlys\naxhhqSEnjybToVt3AgJd8zRiu/fm5LHkWmcphwQH0r5VOEUlSk5eUamonGNAt0s5mOqZZPKDKQ76\nd21FSEgQg7pH07pFGC0iGhHdMoxj6VnVT+BFDhw7Q/9yjmLnZ8+8qO2QERd7MMJSQ2K6XMb+HQkU\n5LlGru7a8gXxMRc2QneXiNAQIps25uu9x12ur916hCvioiq5yz16d45k3dYjLteST2RyPCOb2Nae\nO07OyilgzortvLFqFwVV9DxKd+TyWcIR9iWfpk/nKNYluNq2dmsyveMiL9qBbcTF9xhhqSGtY2K5\nYsgIXpx+Hwf3JJKWcpRlc1/kwJa13HdD9+onqIaAAOGJewYxedbHrNqcxPGMbN7+z3fMnLuRx+8a\n6IFPANMn9OOl97YxZ0UiKelZfL7tCLf8fiWP3N6vVmUYKmLWm1toNW4ezy/czJPzNtIyfi4LVu12\nGaOqPLFgM13vXMgzb25h9PT3KVZl2gvrWLZhP8czsnl/w35+9pe1/OHuQR6xy4iLbzG9m92gqLCQ\nVW+9ysaP3iM3O4v4Aa15+p7+FdZQqS3vb9jP7KUJHEx10KtTJL//ySCG925b/Y01ZPuBNJ5etIXN\nu1OIbhHG/bf0ZuoNPTxyrL113wmGPbCEp0a1L+3B/NXRs8zenMKhpffRqrnz2ltr9vLS0gQ+fn48\nl7YIo7ComOlzNrLjh3QCRNibnMHlMS14dPIAxg7qeNF2lcU4dGtPnYi89RZ1JfLWl5Xf/IX433xA\n0SkHDw5s7XL9ic+PMGRgJ+Y84iw7OfKh95gxqT/xQ86X1szKLSDm9vnsX3wvLZtW3CzdUxhxqR0e\nbQpvuBAjKhWTcTaPyNALIxiiwoJdsqozMvNpW64eS1ijYMJDQ3Bke7ZBe0WYbZH3McLiJkZUKuem\nK+P4PMlRmqEMznydr45kcuc15wtuX92vPf9a69rL6IsdKYQEB9LRg9vKqjDi4l1MgJwbGFGpmpkT\n+/PqB4k8tu4w47q2oLCkhPf3ZhDbpplLeclH7+jPVQ8uxZGdT/yQTnyXnMFL7yXw6q/H1DqMvzaY\nIDrvYVYsNcSISvUEBQXw3eJ7GTEojqXfn+HDg2eZcF0PEubf6TKuTWQTtsybRLuoJrz20U4OpjhY\n/dx4t9uZeAKzcvEOxnlbA4yo1H/MyqV6jPPWgxhRaRiYlYtnMT6WSrBLUJJSHbz6750cTHXQOy6K\nn8X3LI3/MHgXd/oWGarGaysWEWkvIp+LyF4R2S0iD1UwRkTkryJyQER2iEg/b9njDnaJyld7Uhly\n/xJU4dbhXTh8IpMf/fwdkjyUK2SoGWb1cvF4cytUBPxaVS8HBgMPiEj52PexQBfraxow14v21Ag7\ntz6/nrORlx4cwXO/uIqJV3fltRljmHpjD55eVFFzA4M3MeJycXhNWFQ1VVUTrMdngXN9hcoyDnhT\nnXwFNLMandmCnaJyNqeAxB/SuX2ka92Ve67rzppvDttkVcPGiEvtsbuvUFugbErrUS4UH5/0FbLb\nSRsSFEBggHAmK9/l+skzOTR1s5WqwXMYcakddvcVqiga6oLzb2/3FbJbVAAuCQliwqiuPPbqfymy\nGpRl5xby+OubuHfsxWdPG2qPERf38aqwWH2F3gcWq+ryCoYcBdqXed4OSPGmTeWpC6JyjhfvH0bK\nqWzi7vgnN/32Q2InLSDm0nCmT6gTPu0GjREX9/DacbPVV2g+sLeKZmX/Bh4UkXeBQYDD6vnsE+qS\nqABEhF3C6ufGszvpFAdTHfztoVE+y50xVI9JAag5dvcVWg3cABwAcoApXrTHhbomKmXpEduSHrF1\nox2HwRUjLjXD7r5CCjzgLRsqoy6LiqHuY8SlehpcSL8RFYMnMD6XqmlQwmJExeBJjLhUToMRFiMq\nBm9gxKViGoSwGFExeBMjLhdS74XFiIrBFxhxcaVeC4sRFYMvMeJynnorLEZUDHZgxMVJvRQWIyoG\nOzHiUg+FxYiKwWA/9UpYjKgY6goNfdVSb4TFiIqhrtGQxaXeCIvBUBdpqOJSL4TFrFYMdZmGKC5+\nLyxGVAz+QEMTF7/tK2QExeBvNKS+Rd7sK7RARE6KyK5KXh8pIg4R2W59PVHTuY2oGPyZhrB68eZW\naCFwfTVjvlDVPtbX0zWZtEXxiYs2zGCwm/ouLt7sK7QR8E6vDoOhHlCfxcVuH8sQEUnEWZl/hqru\nrmiQiEzD2SkRICtw1Cv7ajB3JJDuGTNtwd/tB///DP5uP3j2M3So6UBxlp31DlajspWq2rOC1yKA\nElXNEpEbgFdUtUv5cRfx3t+q6gBPzedr/N1+8P/P4O/2g32fwbbjZlXNVNUs6/FqIFhEIu2yx2Aw\neA7bhEVEWlu9hxCRgZYtp+yyx2AweA5vNix7BxgJRIrIUeBJIBhKewrdBvxSRIqAXGCSenZf9poH\n57IDf7cf/P8z+Lv9YNNn8KqPxWAwNEz8PqTfYDDUPYywGAwGj1MvhUVEAkVkm4istNuW2iAih0Rk\np5Xq8K3d9tQGEWkmIstE5DsR2SsiQ+y2qaaISLcyqSbbRSRTRB622y53EJFHRGS3iOwSkXdEpJFP\n378++lhEZDowAIhQ1Xi77XEXETkEDFBVvw3OEpFFOFM23hCRECBUVc/YbZe7iEggcAwYpKqH7ban\nJohIW+C/QHdVzRWRpcBqVV3oKxvq3YpFRNoBNwJv2G1LQ8UKfhwOzAdQ1QJ/FBWL0cAP/iIqZQgC\nGotIEBCKM7rdZ9Q7YQFeBh4FSuw25CJQYI2IbLXSGfyNTkAa8E9rS/qGiITZbVQtmQS8Y7cR7qCq\nx4AXgGQgFXCo6hpf2lCvhEVE4oGTqrrVblsukitVtR8wFnhARIbbbZCbBAH9gLmq2hfIBh6z1yT3\nsbZwNwPv2W2LO4hIc2AcEAu0AcJE5C5f2lCvhAW4ErjZ8lG8C1wtIm/ba5L7qGqK9f0ksAIYaK9F\nbnMUOKqqW6zny3AKjb8xFkhQVX+r1TEGSFLVNFUtBJYDQ31pQL0SFlX9raq2U9WOOJewn6mqT5X6\nYhGRMBEJP/cYuBaosFhWXUVVjwNHRKSbdWk0sMdGk2rLHfjZNsgiGRgsIqFW2sxoYK8vDbC7bILh\nQi4FVlhpVEHAv1T1E3tNqhW/AhZb24mDwBSb7XELEQkFrgF+brct7qKqW0RkGZAAFAHb8HFof708\nbjYYDPZSr7ZCBoOhbmCExWAweBwjLAaDweMYYTEYDB7HCIvBYPA4RlgaICLyuJX5usPK3h3k4flH\nVpRZXtl1D7zfeBHpXub5ehHx6yLY/o6JY2lgWOUL4oF+qppvFTAPsdmsi2U8sBL/DMKrl5gVS8Mj\nGkhX1XwAVU0/l0IgIv1FZIOV/PipiERb19eLyMsissmq7zHQuj7QurbN+t6t0ncthxVhvEBEvrHu\nH2ddv1dElovIJyKyX0SeL3PPVBH53rLndRH5u4gMxZnP8xdr9RVnDb9dRL62xg/zxA/OUHOMsDQ8\n1gDtrT+4f4jICAARCQb+Btymqv2BBcAfy9wXpqpDgfut1wC+A4ZbiYZPAM+6YcfjOFMufgSMwikM\n5zKg+wATgV7ARBFpLyJtgD8Ag3FGxF4GoKqbgH8DM61WvT9YcwSp6kDgYZyF3A0+xGyFGhhWg7j+\nwDCcf9BLROQx4FugJ/AfK50gEGfK/Tnese7fKCIRItIMCAcWiUgXnKUegt0w5VqcCaMzrOeNgBjr\n8TpVdQCIyB6cHfgigQ2qmmFdfw/oWsX8y63vW4GObthl8ABGWBogqloMrAfWi8hO4B6cf4C7VbWy\nEpLlcz8UmAV8rqq3iLPr5Xo3zBDgVlV1aZdrOZLzy1wqxvl7Km7MTZk5zt1v8CFmK9TAsOq5lm1l\n2wc4DOwDos7VphWRYBHpUWbcROv6VTgLBzmApjjLNgLc66YpnwK/srJvEZG+1Yz/GhghIs2tqmi3\nlnntLM7Vk6GOYISl4dEE5/Zlj4jsALoDT6lqAc4mcs+JSCKwHdcaHqdFZBMwD5hqXXse+JOIfIlz\n6+QOs3BunXaIyC7reaVYVdGeBbYAa3GeADmsl98FZlpO4LhKpjD4EJPdbKgWEVkPzFBVWzsGiEgT\ny0cUhLMA1gJVXWGnTYaKMSsWgz/xlIhsx1n4Kgn4wGZ7DJVgViwGg8HjmBWLwWDwOEZYDAaDxzHC\nYjAYPI4RFoPB4HGMsBgMBo/zPyVm+YVDZFziAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xcdbd550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(4,3))\n",
    "plt.pcolormesh(xx, yy, Z, cmap = plt.cm.Paired)\n",
    "plt.xlabel('Sepal length')\n",
    "plt.ylabel('Sepal width')\n",
    "plt.xlim(xx.min(), xx.max())\n",
    "plt.ylim(yy.min(), yy.max())\n",
    "plt.scatter(X[:,0], X[:,1], c=Y, edgecolors='k', cmap=plt.cm.Paired)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In summary, we can easily get the logistic regression model which classifies the iris samples based on the features - shape descriptors. \n",
    "\n",
    "I hope that students will be able to construct models for molecular applications, for example, prediction models for classification of chemical whether toxic or not. For those applications, we should think about which descriptors could describe molecules suitably. Traditionally, molecular fingerprint is used to describe a molecular structure in computational manner. \n",
    "We will learn such descriptors and feature learning approaches based on raw molecular structure input, which is central part of deep learning, later."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
